package com.bycx.wechat.service.impl;

import com.alibaba.fastjson.JSON;
import com.bycx.core.startup.AppConfig;
import com.bycx.core.util.HttpHelper;
import com.bycx.core.util.StringUtils;
import com.bycx.wechat.config.WeChatConfig;
import com.bycx.wechat.service.IWeChatConfigService;
import com.bycx.wechat.service.IWeChatMessageService;
import com.bycx.wechat.util.MessagerUtil;
import com.bycx.wechat.util.ReqMessage;
import com.bycx.wechat.util.RespMessage;
import com.bycx.wechat.util.SHA1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信消息接入
 * Created by yiqr on 2017/6/13.
 */
@Service
public class WeChatMessageServiceImpl implements IWeChatMessageService {

    @Autowired
    private IWeChatConfigService weChatConfigService;


    /** 客服消息--向用户发送文本消息地址 **/
    public static String PSOT_MESSAGE_TEXT = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";

    public static String RESP_MESSAGE_TYPE_TEXT = "text";// 回复文本消息

    public static String EVENT_TYPE_SUBSCRIBE = "subscribe"; // 订阅
    public static String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";// 取消订阅
    public static String EVENT_TYPE_CLICK = "CLICK";// 自定义菜单点击事件


    @Override
    public boolean access(HttpServletRequest request) {
        //		开发者通过检验signature对请求进行校验（下面有校验方式）。
        // 		若确认此次GET请求来自微信服务器，请原样返回echostr参数内容，则接入生效，成为开发者成功，
        // 		否则接入失败。加密/校验流程如下：
        //		1）将token、timestamp、nonce三个参数进行字典序排序
        //		2）将三个参数字符串拼接成一个字符串进行sha1加密
        //		3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
        //		参数        描述
        //		signature	微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        //		timestamp	时间戳
        //		nonce		随机数
        //		echostr		随机字符串
        // 微信加密签名
        String signature = request.getParameter("signature");
        //时间戳
        String timestamp = request.getParameter("timestamp");
        //随机数
        String nonce = request.getParameter("nonce");
        //随机字符串
        String echostr = request.getParameter("echostr");
        String reSignature = "";

        //1）将token、timestamp、nonce三个参数进行字典序排序
        String[] str = { AppConfig.get("wx_token")};

        if (StringUtils.isNotEmpty(timestamp)) {
            str = new String[]{ AppConfig.get("wx_token"), timestamp };
        }
        if (StringUtils.isNotEmpty(nonce)) {
            str = new String[]{ AppConfig.get("wx_token"), nonce };
        }
        if (StringUtils.isNotEmpty(nonce) && StringUtils.isNotEmpty(timestamp)) {
            str = new String[]{ AppConfig.get("wx_token"), timestamp, nonce };
        }
        Arrays.sort(str);
        String bigStr = "";
        //2）将三个参数字符串拼接成一个字符串进行sha1加密
        for (int i = 0; i < str.length; i++) {
            bigStr+=str[i];
        }
        if(StringUtils.isNotEmpty(bigStr)){
            reSignature = new SHA1().getDigestOfString(bigStr.getBytes()).toLowerCase();
        }
        //3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
        if (StringUtils.isNotEmpty(reSignature) && signature.equals(reSignature)) {
            return true;
        }else {
            return false;
        }
    }


    @Override
    public void process(HttpServletRequest request,HttpServletResponse response) {
        // 响应消息
        PrintWriter out = null;
    	try {
    	    out = response.getWriter();
			Map<String, String> parseReqMessage = MessagerUtil.parseXml(request);
			// 发送方帐号（open_id）
            String fromUserName = parseReqMessage.get("FromUserName");
            // 公众帐号
            String toUserName = parseReqMessage.get("ToUserName");
            // 消息类型
            String msgType = parseReqMessage.get("MsgType");
            //自定义内容
            String eventKey = parseReqMessage.get("EventKey");
            //事件类型
            String event = parseReqMessage.get("Event");
            //地理位置纬度
            String latitude = parseReqMessage.get("Latitude");
            //地理位置经度
            String longitude = parseReqMessage.get("Longitude");
            //地理位置精度
            String precision = parseReqMessage.get("Precision");

            if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_EVENT)&&ReqMessage.REQ_MESSAGE_TEMPLATESENDJOBFINISH.equals(event)){
                //模板消息发送后的模板推送
            }

            if (msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_TEXT)) {
	            String Content = parseReqMessage.get("Content");
                if("image".equals(Content)){
                }
                if("video".equals(Content)){
                }
                if("text".equals(Content)){
                }
                if("voice".equals(Content)){
                }
                if("news".equals(Content)){
                }
                if("template".equals(Content)){
                }
            }
            //获取地理位置
            else if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_EVENT) && event.toUpperCase().equals(ReqMessage.REQ_MESSAGE_TYPE_LOCATION.toUpperCase())){
            }
            else if (msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_IMAGE)) {
			}
            else if (msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_LINK)) {
			}
            else if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_VOICE)){
            }
            else if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_VIDEO)){
            }

            else if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_SHORTVIDEO)){
            }
            //连接客服
            else if(msgType.equals(ReqMessage.REQ_MESSAGE_TYPE_EVENT) && AppConfig.get("wx_customer_service").equals(eventKey)){
            }
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(out != null)
				out.close();
        }
    }

}
